/***************************************************************************
 *   Copyright (C) 2004 by cyril dupuit                                    *
 *   cyrildupuit@hotmail.com                                               *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

//*****************************************************************************
// Nom du module : Vfs.h
// Description : Ce module est utilise pour gerer le system de fichiers virtuel
//*****************************************************************************
 
// Historique :
// 24/01/05 : Creation du module V1.0

#include "Kernel/Types.h"
#include "Kernel/Semaphor.h"

#ifndef VFS_HEADER
#define VFS_HEADER

//*****************************************************************************

#define VFS_MAX_OPENED_FILES 32
#define MAX_DYNAMIQUE_OPENED_FILE 2000

#define MAX_NESTED_LINKS 5

//*****************************************************************************

struct VfsMount;
struct VfsDentry;
struct VfsFile;

//*****************************************************************************

struct VfsHead {
	struct VfsMount * pMntList; //Liste des descripteurs de montage
	struct VfsMount * pMount; //Racine des descripteurs de montage
	struct VfsMount * * pMntHash; //Tableau de resolution du hachage des points de montage
	Count_t		MntCount; //Nombre des descripteurs montes
	SemID_t		MountSem; //Semaphore de protection des descripteurs de montage
	struct VfsDentry * pUsedList;//Liste des dentry utilisees
	Count_t		UsedCount;//Nombre de dentry contenues dans la liste
	struct VfsDentry * pLruList;//Liste des dentry les moins recemment utilisees
	Count_t		LruCount;//Nombre de dentry contenues dans la liste
	struct VfsDentry * pFreeList;//Liste des dentry libre
	Count_t		FreeCount;//Nombre de dentry contenues dans la liste
	struct VfsMount * * pDentryHash; //Tableau de resolution du hachage des dentry
	};

//*****************************************************************************

struct VfsProcessFiles {
	SemID_t 	FilesSem;
	Count_t 	MaxFilesCount;
	Count_t 	FilesCount;
	Count_t 	DynFilesCount;
	Count_t 	NextIndex;
	Count_t 	DynNextIndex;
	struct VfsFile * * pFileArray;
	struct VfsFile * FileArray[VFS_MAX_OPENED_FILES];
	};

struct OpenIntent {
	Status_t	Flags;
	Status_t	CreateMode;
};

struct NameIData {
	struct VfsDentry	*pDentry;
	struct VfsMount *pMnt;
//	struct qstr	last;
	Status_t	Flags;
	int		last_type;
	unsigned	depth;
	char *SavedNames[MAX_NESTED_LINKS + 1];
	/* Intent data */
	union {
		struct OpenIntent Open;
	} Intent;
};

//*****************************************************************************
// But de la fonction : Initialiser le VFS
// Entree : Aucune
// Parametre retourne : ERROR si erreur d'initialisation, TRUE sinon
//*****************************************************************************
Status_t VfsInit(void);

//*****************************************************************************
// But ce la fonction : Allouer et initialiser la structure de gestion des
// fichiers ouverts
// Entree : Aucune
// Parametre retourne : NULL si memoire disponible insuffisante, pointeur sur
// la structure sinon
//*****************************************************************************
struct VfsProcessFiles * VfsProcessFilesInit(void);

//*****************************************************************************
// But de la fonction : Fermer les fichiers ouverts et restituer la memoire
// allouee
// Entree : 
//	pFiles : Pointeur sur la structure de gestion des fichiers ouverts
// Parametre retourne : ERROR si parametre incorrect, TRUE sinon
//*****************************************************************************
Status_t VfsProcessFilesDelete(struct VfsProcessFiles * pFiles);

//*****************************************************************************
// But de la fonction : Changer la taille du tableau des fichiers ouverts
// Entree : 
//	pFiles : Pointeur sur la structure de gestion des fichiers ouverts
// Parametre retourne : ERROR si memoire disponible insuffisante, FALSE si
// taille maximal atteinte, TRUE sinon
//*****************************************************************************
Status_t VfsProcessFilesResize(struct VfsProcessFiles * pFiles);

//*****************************************************************************

#endif
